part of "../dio.dart";

/// 处理常见的Socket网络错误
/// 每个场合都有可能用到，使用Bug会比Socket简洁直观得多，因此每一个dio实例都应该配备
final _interceptorSocket = InterceptorsWrapper(
  onError: (DioException e, ErrorInterceptorHandler handler) {
    final error = e.error;
    if (error is SocketException) {
      int? code = error.osError?.errorCode;
      late String message;
      if (code == 61) {
        message = "连接不到服务器，可能是因为服务器没有开启";
      } else if (code == 1) {
        message = "操作系统拒绝了连接请求，可能是由于新项目未设置网络请求权限";
      } else if (code == 51) {
        message = "设备无网络连接";
      } else if (code == 65) {
        message = "设备可能有网，但是没有开启APP的网络权限";
      } else if (code == 7) {
        // 当遇到DNS解析失败时，将失败的域名展示出来
        final regex = RegExp(r"Failed host lookup: '(.+?)'");
        final match = regex.firstMatch(error.message);
        final host = match != null ? match.group(1) : '未知';
        message = "无法找到域名[$host]，可能是开发者没有添加当前系统的网络权限（比如Android）";
      } else if (code == 8) {
        // 当遇到DNS解析失败时，将失败的域名展示出来
        final regex = RegExp(r"Failed host lookup: '(.+?)'");
        final match = regex.firstMatch(error.message);
        final host = match != null ? match.group(1) : '未知';
        message = "域名[$host]的DNS解析失败，有可能是你没有网络";
      } else {
        // 继续传播错误
        return handler.next(e);
      }

      // 将错误类型和代码放出来，方便复制黏贴
      throw BugDev("（SocketException，code=$code）$message");
    } else {
      // 继续传播错误
      return handler.next(e);
    }
  },
);
